package com.rd.teacher.jichao.day20;

import java.util.Arrays;
import java.util.Scanner;

public class TestRandom {

    public static void main(String[] args) {
        String all = "郑成祥、王博、孙文卓、郑睿娴、王高博、李春泉、张睿、王星凯、柏云耀、高艺铭、周子贺、杜航、高晨曦、张思韬、孙昊、方周、郭佳宝、姜万里、李宏鸣、薛志鑫、王海鑫、夏银银、吴俊豪、王向阳、徐铭泽、张世煊、才雨鑫、孙国伟、秦嘉林、王岩博、石睿、杜雨坤、黄奕鸣、金洪宇、李鑫、王宇芳、苏岩";

        String[] allArr = all.split("、");
        System.out.println(allArr.length);
        for (int i = 0; i < allArr.length; i++) {
//            System.out.println(allArr[i]);
        }

        // 随机n个
        // Random
        // Math.random()
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要随机的人数：");
        int n = scanner.nextInt();

//        int len = allArr.length;

        test(allArr, n);

//        for (int i = 0; i < n; i++) {
//            // 随机的是  数组中的索引位置
//            // [0,36]   37个元素
//            //  Math.random() 返回的是 [0,1)范围内的一个伪随机数
//            //   0.01 * 37 = 0.37 = 0
//            //   0.10 * 37 = 3.7 = 3
//            //   0.90 * 37 = 33.3 = 33
//            //   0.99 * 37 = 36.63 = 36
//            int index = (int) (Math.random() * len);
//            System.out.println(allArr[index]);
//        }


        // 如果再去重
        // 数组去重
        //   可以选择两种方式  1 对随机的索引去重  2 对随机后取出的元素去重

        //  对于索引去重的方式
        //  n = 5 如果需要随机5次
        //  indexArr = {2,3,7}
        //  当随机出新的索引时  6

        // 随机出来的索引


//         数组去重的更好办法
//         allArr = {}    [0,36]
//         indexArr = {}   37个0  37个-1
//          2    indexArr[2] = 2
//
//         用数组来记录已经出现过的索引
//         indexArr = {2,3}
//         6  {2,3,6}  如果出现重复了  把随机的次数减1 代表要重新随机一次
//
//         能不能不通过遍历数组的方式  来判断某个元素是否出现过
//         indexArr = {-1,-1,-1,-1}    37个-1
//         indexArr = {-1,-1,2,3}
//         6  indexArr[6]


    }


    // allArr 是存储所有同学名字的数组
    // n 是键盘输入的需要随机的数量
    public static void test(String[] allArr, int n) {
        int len = allArr.length;
        // 因为随机的是索引位置
        // 通过随机一个位置  在数组中记录此位置
        // 下一次随机时  如何判断重复呢  通过遍历数组

        // indexArr用来存储随机过的索引位置
        // 因为需要随机n个不重复的  所以定长为n
        // 如果n=5  indexArr {0,0,0,0,0}
        // 如果存入一个 需要存入indexArr的索引位置
        int[] indexArr = new int[n];

        // 已经随机出的个数
//        int cnt = 0;

        for (int i = 0; i < n; i++) {
            int index = (int) (Math.random() * len);

            // 判断是否已经随机过
            // 通过数组来存储  需要遍历数组来判断是否重复
            boolean flag = false;
            // 0 -> 1
            // indexArr = {2}   cnt=1
            // 3  indexArr = {2,3}   cnt=2
            for (int j = 0; j < i; j++) {
                if (index == indexArr[j]) {
                    // 代表已经出现过
                    flag = true;
                    break;
                }
            }
            // 如果已经随机过
            if (flag) {
                i--;
                continue;
            }

            // 如果没有随机过  添加进数组中
            indexArr[i] = index;
            System.out.println(Arrays.toString(indexArr));
            System.out.println(allArr[index]);
        }
    }


    public static void test1(String[] allArr, int n) {
        int len = allArr.length;
        int[] indexArr1 = new int[len];
        for (int i = 0; i < indexArr1.length; i++) {
            indexArr1[i] = -1;
        }
        System.out.println(Arrays.toString(indexArr1));

        for (int i = 0; i < n; i++) {
            // [0,36]  在indexArr1的索引范围内
            // 可以通过数组索引来记录一个值是否出现过  而不再使用本身的元素
            int random = (int) (Math.random() * len);
            if (indexArr1[random] == -1) {
                // 代表random没有出现过
                indexArr1[random] = random;
                System.out.println("本次随机出：" + random);
                System.out.println(allArr[random]);
                System.out.println(Arrays.toString(indexArr1));
            } else {
                // 代表已经出现过  这一次随机不生效
                System.out.println("已经随机过：" + random);
                i--;
            }
        }
    }
}
